package com.xc.disk.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.concurrent.TimeUnit;


/**
 * <p>项目名称: Stars</p>
 * <p>描述: redis工具类</p>
 * <P>创建人: 小程</p>
 * <P>创建人邮箱: 779943476@qq.com</p>
 * <p>创建时间: 2019/7/1</p>
 *
 * @version v1.0
 */
public class RedisUtils {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;


    private static RedisUtils redisUtil;

    /**
     * <p>功能描述: 初始化加载</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     */
    @PostConstruct
    public void load() {
        redisUtil = this;
        redisUtil.redisTemplate = this.redisTemplate;
    }

    /**
     * <p>功能描述: 存入数据有效期1800000毫秒（30分钟）</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param key   数据ke
     * @param value 数据对象
     */
    public static void set(String key, Object value) {
        set(key, value, null, null);
    }

    /**
     * <p>功能描述: 存入数据自定义有效期（单位为毫秒）</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param key     数据key
     * @param value   数据对象
     * @param timeout 有效期,时间null有效期为永久
     */
    public static void set(String key, Object value, Long timeout) {
        set(key, value, timeout, TimeUnit.MILLISECONDS);
    }

    /**
     * <p>功能描述: 存入数据自定义有效期，有效期单位</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param key     数据key
     * @param value   数据对象
     * @param timeout 有效期,时间null有效期为永久
     * @param unit    有效期单位
     */
    public static void set(String key, Object value, Long timeout, TimeUnit unit) {
        if (timeout == null) {
            redisUtil.redisTemplate.opsForValue().set(key, value);
        } else {
            redisUtil.redisTemplate.opsForValue().set(key, value, timeout, unit);
        }
    }

    /**
     * <p>功能描述:删除数据</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param key 数据key
     */
    public static void delete(String key) {
        redisUtil.redisTemplate.delete(key);
        redisUtil.redisTemplate.delete(new HashSet<String>());
        redisUtil.redisTemplate.randomKey();

    }

    /**
     * <p>功能描述:获取存入Redis的数据</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param key 数据key
     * @param <T> 数据类型
     * @return 数据
     */
    public static <T> T get(String key) {
        return (T) redisUtil.redisTemplate.opsForValue().get(key);
    }


    /**
     * 获取锁
     *
     * @param key         锁的key
     * @param currentTime 当前时间
     * @return 是否获取到锁
     */
    public static synchronized boolean lock(String key, Long currentTime) {
        while (true) {
            if ((System.currentTimeMillis() - currentTime) > 300000L) {
                return false;
            }
            Boolean success = redisUtil.redisTemplate.opsForValue().setIfAbsent(key, currentTime);
            if (success != null && success) {
                return true;
            }
        }
    }

    /**
     * 解锁
     *
     * @param key
     */
    public static void unlock(String key) {
        redisUtil.redisTemplate.opsForValue().getOperations().delete(key);
    }
}
